#ifndef MYLIB_APP_MENU_H
#define MYLIB_APP_MENU_H

#include <mylib/device/oled.h>

typedef enum
{
    menu_event_type_none,     // nothing
    menu_event_type_enter,    // 进入一个子菜单的事件
    menu_event_type_exit,     // 退出一个子菜单的事件
    menu_event_type_select,   // 选择一个选项的事件
} menu_event_type_enum;

// 菜单项事件类型
typedef struct
{
    menu_event_type_enum type;   // 事件类型
    void*                data;   // 事件数据
} menu_event_t;

// 菜单选项
typedef struct
{
    char* name;   // 菜单项名称
} menu_option_t;

// 事件处理函数类型
typedef void (*menu_evnet_handler_func_t)(menu_event_t* evnet);

// 菜单对象
typedef struct
{
    oled_t*                   oled;             // oled对象
    menu_option_t*            options;          // 菜单项数组
    uint8_t                   option_count;     // 菜单项数量
    uint8_t                   current_option;   // 当前选中的菜单项索引
    menu_evnet_handler_func_t event_getter;     // 事件获取函数
    menu_evnet_handler_func_t evnet_handler;    // 事件处理函数
} menu_t;

// 创建菜单
void menu_create(menu_t* menu, oled_t* oled, menu_evnet_handler_func_t event_getter,
                 menu_evnet_handler_func_t evnet_handler);
// 添加菜单项到菜单
void menu_add_option(menu_t* menu, menu_option_t* option);
// 删除菜单项通过index
void menu_remove_option_by_index(menu_t* menu, uint8_t index);
// 删除菜单项通过name
void menu_remove_option_by_name(menu_t* menu, char* name);
// 开始运行菜单
void menu_start(menu_t* menu);

#endif   // !MYLIB_APP_MENU_H
